package com.gobang.domain.vo;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

/**
 * 分页数据封装
 * 
 * @author Gobang Team
 * @version 1.0.0
 * @param <T> 数据类型
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PageData<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 当前页码（从1开始）
     */
    private Integer pageNum;

    /**
     * 每页大小
     */
    private Integer pageSize;

    /**
     * 总记录数
     */
    private Long total;

    /**
     * 总页数
     */
    private Integer totalPages;

    /**
     * 数据列表
     */
    private List<T> list;

    /**
     * 是否有上一页
     */
    private Boolean hasPrevious;

    /**
     * 是否有下一页
     */
    private Boolean hasNext;

    /**
     * 私有构造函数
     */
    private PageData() {
    }

    /**
     * 私有构造函数
     */
    private PageData(Integer pageNum, Integer pageSize, Long total, List<T> list) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;
        this.list = list;
        
        // 计算总页数
        this.totalPages = (int) Math.ceil((double) total / pageSize);
        
        // 计算是否有上一页和下一页
        this.hasPrevious = pageNum > 1;
        this.hasNext = pageNum < totalPages;
    }

    /**
     * 创建分页数据
     * 
     * @param pageNum 当前页码
     * @param pageSize 每页大小
     * @param total 总记录数
     * @param list 数据列表
     * @return 分页数据
     */
    public static <T> PageData<T> of(Integer pageNum, Integer pageSize, Long total, List<T> list) {
        return new PageData<>(pageNum, pageSize, total, list);
    }

    /**
     * 创建空分页数据
     * 
     * @return 空分页数据
     */
    public static <T> PageData<T> empty() {
        return new PageData<>(1, 10, 0L, Collections.emptyList());
    }

    /**
     * 创建空分页数据（自定义分页参数）
     * 
     * @param pageNum 当前页码
     * @param pageSize 每页大小
     * @return 空分页数据
     */
    public static <T> PageData<T> empty(Integer pageNum, Integer pageSize) {
        return new PageData<>(pageNum, pageSize, 0L, Collections.emptyList());
    }

    /**
     * 从MyBatis-Plus的Page对象转换
     * 
     * @param page MyBatis-Plus的Page对象
     * @return 分页数据
     */
    public static <T> PageData<T> fromPage(com.baomidou.mybatisplus.extension.plugins.pagination.Page<T> page) {
        return new PageData<>(
            (int) page.getCurrent(),
            (int) page.getSize(),
            page.getTotal(),
            page.getRecords()
        );
    }

}

